package semant;

import syntaxtree.Program;
import errors.ErrorEchoer;

public class TypeChecker
{
	/* Guarda a tabela de símbolos */
	Env env;
	/* Echoer de erros */
	ErrorEchoer err;
	/* Gerador da tabela de simbolos */
	TableGenerator generator;
	/* Verificador de tipos */
	TableChecker checker;

	private TypeChecker(ErrorEchoer err)
	{
		super();
		env = new Env(err);
		generator = new TableGenerator(env, err);
		checker = new TableChecker(env, err);
	}

	public static Env TypeCheck(ErrorEchoer err, Program p)
	{
		TypeChecker typeChecker = new TypeChecker(err);

		/* Primeira passada: Povoa tabela de símbolos */
		p.accept(typeChecker.generator);

		/* Segunda passada: Checa todos os nós por erros de semantica */
		p.accept(typeChecker.checker);

		return typeChecker.env;
	}
}
